using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._SpatialAnalystTools._Extraction
{
    /// <summary>
    /// <para>Extract Multi Values to Points</para>
    /// <para>Extracts cell values at locations specified in a point feature class from one or more rasters and records the values to the attribute table of the point feature class.</para>
    /// <para>从一个或多个栅格中提取点要素类中指定位置的像元值，并将这些值记录到点要素类的属性表中。</para>
    /// </summary>    
    [DisplayName("Extract Multi Values to Points")]
    public class ExtractMultiValuesToPoints : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ExtractMultiValuesToPoints()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_point_features">
        /// <para>Input point features</para>
        /// <para>The input point features to which you want to add raster values.</para>
        /// <para>要向其添加栅格值的输入点要素。</para>
        /// </param>
        /// <param name="_in_rasters">
        /// <para>Input rasters</para>
        /// <para><xdoc>
        ///   <para>The input raster (or rasters) values you want to extract based on the input point feature location.</para>
        ///   <para>Optionally, you can supply the name for the field to store the raster value. By default, a unique field name will be created based on the input raster dataset name.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要根据输入点要素位置提取的输入栅格（或栅格）值。</para>
        ///   <para>或者，您可以提供用于存储栅格值的字段的名称。默认情况下，将根据输入栅格数据集名称创建唯一的字段名称。</para>
        /// </xdoc></para>
        /// </param>
        public ExtractMultiValuesToPoints(object _in_point_features, object _in_rasters)
        {
            this._in_point_features = _in_point_features;
            this._in_rasters = _in_rasters;
        }
        public override string ToolboxName => "Spatial Analyst Tools";

        public override string ToolName => "Extract Multi Values to Points";

        public override string CallName => "sa.ExtractMultiValuesToPoints";

        public override List<string> AcceptEnvironments => ["autoCommit", "configKeyword", "extent", "mask", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_point_features, _in_rasters, _bilinear_interpolate_values.GetGPValue(), _out_point_features];

        /// <summary>
        /// <para>Input point features</para>
        /// <para>The input point features to which you want to add raster values.</para>
        /// <para>要向其添加栅格值的输入点要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input point features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_point_features { get; set; }


        /// <summary>
        /// <para>Input rasters</para>
        /// <para><xdoc>
        ///   <para>The input raster (or rasters) values you want to extract based on the input point feature location.</para>
        ///   <para>Optionally, you can supply the name for the field to store the raster value. By default, a unique field name will be created based on the input raster dataset name.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要根据输入点要素位置提取的输入栅格（或栅格）值。</para>
        ///   <para>或者，您可以提供用于存储栅格值的字段的名称。默认情况下，将根据输入栅格数据集名称创建唯一的字段名称。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input rasters")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_rasters { get; set; }


        /// <summary>
        /// <para>Bilinear interpolation of values at point locations</para>
        /// <para><xdoc>
        ///   <para>Specifies whether interpolation will be used.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—No interpolation will be applied; the value of the cell center will be used. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—The value of the cell will be calculated from the adjacent cells with valid values using bilinear interpolation. NoData values will be ignored in the interpolation unless all adjacent cells are NoData.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否使用插值。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 不应用插值;将使用单元中心的值。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 将使用双线性插值从具有有效值的相邻像元计算像元的值。除非所有相邻单元格都是 NoData，否则插值中将忽略 NoData 值。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Bilinear interpolation of values at point locations")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _bilinear_interpolate_values_value _bilinear_interpolate_values { get; set; } = _bilinear_interpolate_values_value._false;

        public enum _bilinear_interpolate_values_value
        {
            /// <summary>
            /// <para>NONE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NONE")]
            [GPEnumValue("false")]
            _false,

            /// <summary>
            /// <para>BILINEAR</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("BILINEAR")]
            [GPEnumValue("true")]
            _true,

        }

        /// <summary>
        /// <para>Updated point features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Updated point features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_point_features { get; set; }


        public ExtractMultiValuesToPoints SetEnv(int? autoCommit = null, object configKeyword = null, object extent = null, object mask = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, mask: mask, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}